{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:15.376921100Z",
     "start_time": "2024-11-06T14:29:08.058815500Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "import ppsci\n",
    "from ppsci.utils import logger"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "# set random seed(42) for reproducibility\n",
    "ppsci.utils.misc.set_random_seed(42)\n",
    "\n",
    "# set output directory\n",
    "OUTPUT_DIR = \"./output_quick_start_case1\"\n",
    "\n",
    "# initialize logger while create output directory\n",
    "logger.init_logger(\"ppsci\", f\"{OUTPUT_DIR}/train.log\", \"info\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:15.391371700Z",
     "start_time": "2024-11-06T14:29:15.375921700Z"
    }
   },
   "id": "99e65d8bb603c17d"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "# set 1D-geometry domain([-π, π])\n",
    "l_limit, r_limit = -np.pi, np.pi\n",
    "x_domain = ppsci.geometry.Interval(l_limit, r_limit)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:15.420811600Z",
     "start_time": "2024-11-06T14:29:15.391371700Z"
    }
   },
   "id": "5f5f3db22b1bb90a"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "# set model to 3-layer MLP\n",
    "model = ppsci.arch.MLP((\"x\",), (\"u\",), 3, 64)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:19.216845800Z",
     "start_time": "2024-11-06T14:29:15.409385500Z"
    }
   },
   "id": "c67f3c3704c802a7"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2024/11/06 22:29:19] ppsci INFO: Auto collation is disabled and set num_workers to 0 to speed up batch sampling.\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "# standard solution of sin(x)\n",
    "def sin_compute_func(data: dict):\n",
    "    return np.sin(data[\"x\"])\n",
    "\n",
    "\n",
    "# set constraint on 1D-geometry([-π, π])\n",
    "ITERS_PER_EPOCH = 100  # use 100 iterations per training epoch\n",
    "interior_constraint = ppsci.constraint.InteriorConstraint(\n",
    "    output_expr={\"u\": lambda out: out[\"u\"]},\n",
    "    label_dict={\"u\": sin_compute_func},\n",
    "    geom=x_domain,\n",
    "    dataloader_cfg={\n",
    "        \"dataset\": \"NamedArrayDataset\",\n",
    "        \"iters_per_epoch\": ITERS_PER_EPOCH,\n",
    "        \"sampler\": {\n",
    "            \"name\": \"BatchSampler\",\n",
    "            \"shuffle\": True,\n",
    "        },\n",
    "        \"batch_size\": 32,  # use 32 samples(points) per iteration for interior constraint\n",
    "    },\n",
    "    loss=ppsci.loss.MSELoss(),\n",
    ")\n",
    "# wrap constraint(s) into one dict\n",
    "constraint = {\n",
    "    interior_constraint.name: interior_constraint,\n",
    "}"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:19.237636600Z",
     "start_time": "2024-11-06T14:29:19.218861500Z"
    }
   },
   "id": "59506b45833eeefc"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "# set training hyper-parameters\n",
    "EPOCHS = 10\n",
    "# set optimizer\n",
    "optimizer = ppsci.optimizer.Adam(2e-3)(model)\n",
    "\n",
    "# set visualizer\n",
    "visual_input_dict = {\n",
    "    \"x\": np.linspace(l_limit, r_limit, 1000, dtype=\"float32\").reshape(1000, 1)\n",
    "}\n",
    "visual_input_dict[\"u_ref\"] = np.sin(visual_input_dict[\"x\"])\n",
    "visualizer = {\n",
    "    \"visualize_u\": ppsci.visualize.VisualizerScatter1D(\n",
    "        visual_input_dict,\n",
    "        (\"x\",),\n",
    "        {\"u_pred\": lambda out: out[\"u\"], \"u_ref\": lambda out: out[\"u_ref\"]},\n",
    "        prefix=\"u=sin(x)\",\n",
    "    ),\n",
    "}"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:19.277841400Z",
     "start_time": "2024-11-06T14:29:19.236629700Z"
    }
   },
   "id": "feaa95c419612edb"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2024/11/06 22:29:19] ppsci INFO: Using paddlepaddle 3.0.0-beta1 on device Place(gpu:0)\u001B[0m\n",
      "\u001B[36m[2024/11/06 22:29:19] ppsci MESSAGE: Set to_static=False for computational optimization.\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter   1/100] lr: 0.00200, loss: 0.34426, EQ: 0.34426, batch_cost: 1.44174s, reader_cost: 0.00049s, ips: 22.20, eta: 0:24:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  10/100] lr: 0.00200, loss: 0.17181, EQ: 0.17181, batch_cost: 0.00116s, reader_cost: 0.00005s, ips: 27494.82, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  20/100] lr: 0.00200, loss: 0.13495, EQ: 0.13495, batch_cost: 0.00124s, reader_cost: 0.00004s, ips: 25719.96, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  30/100] lr: 0.00200, loss: 0.11068, EQ: 0.11068, batch_cost: 0.00126s, reader_cost: 0.00004s, ips: 25357.98, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  40/100] lr: 0.00200, loss: 0.09087, EQ: 0.09087, batch_cost: 0.00119s, reader_cost: 0.00005s, ips: 26885.11, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  50/100] lr: 0.00200, loss: 0.07822, EQ: 0.07822, batch_cost: 0.00103s, reader_cost: 0.00004s, ips: 31183.31, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  60/100] lr: 0.00200, loss: 0.06877, EQ: 0.06877, batch_cost: 0.00104s, reader_cost: 0.00005s, ips: 30653.40, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  70/100] lr: 0.00200, loss: 0.06111, EQ: 0.06111, batch_cost: 0.00106s, reader_cost: 0.00004s, ips: 30114.81, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  80/100] lr: 0.00200, loss: 0.05556, EQ: 0.05556, batch_cost: 0.00100s, reader_cost: 0.00004s, ips: 32128.19, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter  90/100] lr: 0.00200, loss: 0.05111, EQ: 0.05111, batch_cost: 0.00116s, reader_cost: 0.00004s, ips: 27696.28, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  1/10][Iter 100/100] lr: 0.00200, loss: 0.04759, EQ: 0.04759, batch_cost: 0.00125s, reader_cost: 0.00006s, ips: 25652.74, eta: 0:00:01\u001B[0m\n",
      "\u001B[36m[2024/11/06 22:29:20] ppsci MESSAGE: Finish saving checkpoint to: ./output_quick_start_case1\\checkpoints\\latest(latest checkpoint will be saved every epoch as expected, but this log will be printed only once for tidy logging)\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  10/100] lr: 0.00200, loss: 0.01767, EQ: 0.01767, batch_cost: 0.00170s, reader_cost: 0.00064s, ips: 18841.15, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  20/100] lr: 0.00200, loss: 0.01578, EQ: 0.01578, batch_cost: 0.00116s, reader_cost: 0.00004s, ips: 27657.50, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  30/100] lr: 0.00200, loss: 0.01480, EQ: 0.01480, batch_cost: 0.00126s, reader_cost: 0.00005s, ips: 25365.62, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  40/100] lr: 0.00200, loss: 0.01394, EQ: 0.01394, batch_cost: 0.00132s, reader_cost: 0.00004s, ips: 24175.39, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  50/100] lr: 0.00200, loss: 0.01279, EQ: 0.01279, batch_cost: 0.00109s, reader_cost: 0.00004s, ips: 29246.71, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  60/100] lr: 0.00200, loss: 0.01267, EQ: 0.01267, batch_cost: 0.00110s, reader_cost: 0.00005s, ips: 29026.00, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  70/100] lr: 0.00200, loss: 0.01230, EQ: 0.01230, batch_cost: 0.00159s, reader_cost: 0.00005s, ips: 20089.40, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  80/100] lr: 0.00200, loss: 0.01186, EQ: 0.01186, batch_cost: 0.00109s, reader_cost: 0.00007s, ips: 29425.29, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter  90/100] lr: 0.00200, loss: 0.01150, EQ: 0.01150, batch_cost: 0.00102s, reader_cost: 0.00004s, ips: 31442.83, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  2/10][Iter 100/100] lr: 0.00200, loss: 0.01125, EQ: 0.01125, batch_cost: 0.00127s, reader_cost: 0.00004s, ips: 25173.66, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  3/10][Iter  10/100] lr: 0.00200, loss: 0.01082, EQ: 0.01082, batch_cost: 0.00158s, reader_cost: 0.00031s, ips: 20213.89, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  3/10][Iter  20/100] lr: 0.00200, loss: 0.00926, EQ: 0.00926, batch_cost: 0.00100s, reader_cost: 0.00005s, ips: 31964.20, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:20] ppsci INFO: [Train][Epoch  3/10][Iter  30/100] lr: 0.00200, loss: 0.00816, EQ: 0.00816, batch_cost: 0.00104s, reader_cost: 0.00004s, ips: 30759.47, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  40/100] lr: 0.00200, loss: 0.00747, EQ: 0.00747, batch_cost: 0.00116s, reader_cost: 0.00005s, ips: 27652.96, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  50/100] lr: 0.00200, loss: 0.00726, EQ: 0.00726, batch_cost: 0.00106s, reader_cost: 0.00004s, ips: 30194.95, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  60/100] lr: 0.00200, loss: 0.00684, EQ: 0.00684, batch_cost: 0.00138s, reader_cost: 0.00005s, ips: 23109.03, eta: 0:00:01\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  70/100] lr: 0.00200, loss: 0.00648, EQ: 0.00648, batch_cost: 0.00123s, reader_cost: 0.00004s, ips: 26080.51, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  80/100] lr: 0.00200, loss: 0.00625, EQ: 0.00625, batch_cost: 0.00108s, reader_cost: 0.00006s, ips: 29693.97, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter  90/100] lr: 0.00200, loss: 0.00609, EQ: 0.00609, batch_cost: 0.00125s, reader_cost: 0.00004s, ips: 25687.34, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  3/10][Iter 100/100] lr: 0.00200, loss: 0.00595, EQ: 0.00595, batch_cost: 0.00119s, reader_cost: 0.00005s, ips: 26955.77, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  10/100] lr: 0.00200, loss: 0.00364, EQ: 0.00364, batch_cost: 0.00137s, reader_cost: 0.00027s, ips: 23280.01, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  20/100] lr: 0.00200, loss: 0.00344, EQ: 0.00344, batch_cost: 0.00122s, reader_cost: 0.00006s, ips: 26268.70, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  30/100] lr: 0.00200, loss: 0.00346, EQ: 0.00346, batch_cost: 0.00124s, reader_cost: 0.00005s, ips: 25778.39, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  40/100] lr: 0.00200, loss: 0.00376, EQ: 0.00376, batch_cost: 0.00109s, reader_cost: 0.00004s, ips: 29351.60, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  50/100] lr: 0.00200, loss: 0.00369, EQ: 0.00369, batch_cost: 0.00140s, reader_cost: 0.00005s, ips: 22901.97, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  60/100] lr: 0.00200, loss: 0.00361, EQ: 0.00361, batch_cost: 0.00114s, reader_cost: 0.00007s, ips: 28156.87, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  70/100] lr: 0.00200, loss: 0.00351, EQ: 0.00351, batch_cost: 0.00116s, reader_cost: 0.00006s, ips: 27480.55, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  80/100] lr: 0.00200, loss: 0.00342, EQ: 0.00342, batch_cost: 0.00115s, reader_cost: 0.00005s, ips: 27736.85, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter  90/100] lr: 0.00200, loss: 0.00342, EQ: 0.00342, batch_cost: 0.00124s, reader_cost: 0.00007s, ips: 25707.15, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  4/10][Iter 100/100] lr: 0.00200, loss: 0.00341, EQ: 0.00341, batch_cost: 0.00136s, reader_cost: 0.00004s, ips: 23535.30, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  10/100] lr: 0.00200, loss: 0.00306, EQ: 0.00306, batch_cost: 0.00144s, reader_cost: 0.00028s, ips: 22277.30, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  20/100] lr: 0.00200, loss: 0.00312, EQ: 0.00312, batch_cost: 0.00127s, reader_cost: 0.00005s, ips: 25113.40, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  30/100] lr: 0.00200, loss: 0.00445, EQ: 0.00445, batch_cost: 0.00129s, reader_cost: 0.00004s, ips: 24881.62, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  40/100] lr: 0.00200, loss: 0.00436, EQ: 0.00436, batch_cost: 0.00129s, reader_cost: 0.00006s, ips: 24897.49, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  50/100] lr: 0.00200, loss: 0.00384, EQ: 0.00384, batch_cost: 0.00128s, reader_cost: 0.00007s, ips: 24981.85, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  60/100] lr: 0.00200, loss: 0.00356, EQ: 0.00356, batch_cost: 0.00166s, reader_cost: 0.00007s, ips: 19250.32, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  70/100] lr: 0.00200, loss: 0.00332, EQ: 0.00332, batch_cost: 0.00129s, reader_cost: 0.00005s, ips: 24885.49, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  80/100] lr: 0.00200, loss: 0.00337, EQ: 0.00337, batch_cost: 0.00175s, reader_cost: 0.00014s, ips: 18300.98, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter  90/100] lr: 0.00200, loss: 0.00342, EQ: 0.00342, batch_cost: 0.00180s, reader_cost: 0.00007s, ips: 17811.52, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  5/10][Iter 100/100] lr: 0.00200, loss: 0.00326, EQ: 0.00326, batch_cost: 0.00142s, reader_cost: 0.00009s, ips: 22599.03, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  10/100] lr: 0.00200, loss: 0.00152, EQ: 0.00152, batch_cost: 0.00203s, reader_cost: 0.00042s, ips: 15735.56, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  20/100] lr: 0.00200, loss: 0.00206, EQ: 0.00206, batch_cost: 0.00123s, reader_cost: 0.00005s, ips: 25924.37, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  30/100] lr: 0.00200, loss: 0.00343, EQ: 0.00343, batch_cost: 0.00145s, reader_cost: 0.00024s, ips: 22060.60, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  40/100] lr: 0.00200, loss: 0.00352, EQ: 0.00352, batch_cost: 0.00134s, reader_cost: 0.00005s, ips: 23878.82, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  50/100] lr: 0.00200, loss: 0.00361, EQ: 0.00361, batch_cost: 0.00132s, reader_cost: 0.00007s, ips: 24183.80, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  60/100] lr: 0.00200, loss: 0.00378, EQ: 0.00378, batch_cost: 0.00214s, reader_cost: 0.00010s, ips: 14929.48, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  70/100] lr: 0.00200, loss: 0.00360, EQ: 0.00360, batch_cost: 0.00119s, reader_cost: 0.00004s, ips: 26882.17, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  80/100] lr: 0.00200, loss: 0.00332, EQ: 0.00332, batch_cost: 0.00146s, reader_cost: 0.00005s, ips: 21985.57, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter  90/100] lr: 0.00200, loss: 0.00311, EQ: 0.00311, batch_cost: 0.00133s, reader_cost: 0.00006s, ips: 24150.03, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  6/10][Iter 100/100] lr: 0.00200, loss: 0.00292, EQ: 0.00292, batch_cost: 0.00139s, reader_cost: 0.00005s, ips: 22994.95, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  10/100] lr: 0.00200, loss: 0.00126, EQ: 0.00126, batch_cost: 0.00136s, reader_cost: 0.00028s, ips: 23558.86, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  20/100] lr: 0.00200, loss: 0.00114, EQ: 0.00114, batch_cost: 0.00135s, reader_cost: 0.00005s, ips: 23709.15, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  30/100] lr: 0.00200, loss: 0.00124, EQ: 0.00124, batch_cost: 0.00123s, reader_cost: 0.00007s, ips: 26048.45, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  40/100] lr: 0.00200, loss: 0.00122, EQ: 0.00122, batch_cost: 0.00113s, reader_cost: 0.00005s, ips: 28221.18, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  50/100] lr: 0.00200, loss: 0.00114, EQ: 0.00114, batch_cost: 0.00122s, reader_cost: 0.00006s, ips: 26124.79, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  60/100] lr: 0.00200, loss: 0.00112, EQ: 0.00112, batch_cost: 0.00108s, reader_cost: 0.00005s, ips: 29572.95, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  70/100] lr: 0.00200, loss: 0.00114, EQ: 0.00114, batch_cost: 0.00103s, reader_cost: 0.00004s, ips: 31196.99, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  80/100] lr: 0.00200, loss: 0.00123, EQ: 0.00123, batch_cost: 0.00103s, reader_cost: 0.00004s, ips: 31142.04, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter  90/100] lr: 0.00200, loss: 0.00127, EQ: 0.00127, batch_cost: 0.00101s, reader_cost: 0.00003s, ips: 31760.53, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  7/10][Iter 100/100] lr: 0.00200, loss: 0.00122, EQ: 0.00122, batch_cost: 0.00093s, reader_cost: 0.00003s, ips: 34377.18, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  10/100] lr: 0.00200, loss: 0.00078, EQ: 0.00078, batch_cost: 0.00125s, reader_cost: 0.00026s, ips: 25525.67, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  20/100] lr: 0.00200, loss: 0.00078, EQ: 0.00078, batch_cost: 0.00131s, reader_cost: 0.00004s, ips: 24339.97, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  30/100] lr: 0.00200, loss: 0.00087, EQ: 0.00087, batch_cost: 0.00115s, reader_cost: 0.00004s, ips: 27921.51, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  40/100] lr: 0.00200, loss: 0.00080, EQ: 0.00080, batch_cost: 0.00107s, reader_cost: 0.00003s, ips: 29905.70, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  50/100] lr: 0.00200, loss: 0.00076, EQ: 0.00076, batch_cost: 0.00119s, reader_cost: 0.00004s, ips: 26806.96, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  60/100] lr: 0.00200, loss: 0.00078, EQ: 0.00078, batch_cost: 0.00116s, reader_cost: 0.00004s, ips: 27646.03, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  70/100] lr: 0.00200, loss: 0.00086, EQ: 0.00086, batch_cost: 0.00109s, reader_cost: 0.00004s, ips: 29331.96, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  80/100] lr: 0.00200, loss: 0.00105, EQ: 0.00105, batch_cost: 0.00108s, reader_cost: 0.00004s, ips: 29526.83, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter  90/100] lr: 0.00200, loss: 0.00124, EQ: 0.00124, batch_cost: 0.00113s, reader_cost: 0.00004s, ips: 28236.37, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  8/10][Iter 100/100] lr: 0.00200, loss: 0.00128, EQ: 0.00128, batch_cost: 0.00120s, reader_cost: 0.00005s, ips: 26567.92, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  10/100] lr: 0.00200, loss: 0.00453, EQ: 0.00453, batch_cost: 0.00148s, reader_cost: 0.00025s, ips: 21597.25, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  20/100] lr: 0.00200, loss: 0.00351, EQ: 0.00351, batch_cost: 0.00105s, reader_cost: 0.00004s, ips: 30473.00, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  30/100] lr: 0.00200, loss: 0.00262, EQ: 0.00262, batch_cost: 0.00122s, reader_cost: 0.00005s, ips: 26249.52, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  40/100] lr: 0.00200, loss: 0.00214, EQ: 0.00214, batch_cost: 0.00105s, reader_cost: 0.00005s, ips: 30396.00, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  50/100] lr: 0.00200, loss: 0.00202, EQ: 0.00202, batch_cost: 0.00107s, reader_cost: 0.00004s, ips: 29947.97, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  60/100] lr: 0.00200, loss: 0.00187, EQ: 0.00187, batch_cost: 0.00112s, reader_cost: 0.00005s, ips: 28670.50, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  70/100] lr: 0.00200, loss: 0.00172, EQ: 0.00172, batch_cost: 0.00114s, reader_cost: 0.00005s, ips: 27993.56, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  80/100] lr: 0.00200, loss: 0.00156, EQ: 0.00156, batch_cost: 0.00166s, reader_cost: 0.00006s, ips: 19326.94, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter  90/100] lr: 0.00200, loss: 0.00144, EQ: 0.00144, batch_cost: 0.00119s, reader_cost: 0.00006s, ips: 26782.28, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch  9/10][Iter 100/100] lr: 0.00200, loss: 0.00132, EQ: 0.00132, batch_cost: 0.00106s, reader_cost: 0.00004s, ips: 30162.78, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch 10/10][Iter  10/100] lr: 0.00200, loss: 0.00027, EQ: 0.00027, batch_cost: 0.00131s, reader_cost: 0.00031s, ips: 24434.38, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch 10/10][Iter  20/100] lr: 0.00200, loss: 0.00025, EQ: 0.00025, batch_cost: 0.00106s, reader_cost: 0.00005s, ips: 30313.08, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch 10/10][Iter  30/100] lr: 0.00200, loss: 0.00024, EQ: 0.00024, batch_cost: 0.00107s, reader_cost: 0.00004s, ips: 29773.26, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:21] ppsci INFO: [Train][Epoch 10/10][Iter  40/100] lr: 0.00200, loss: 0.00027, EQ: 0.00027, batch_cost: 0.00110s, reader_cost: 0.00003s, ips: 29013.89, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter  50/100] lr: 0.00200, loss: 0.00035, EQ: 0.00035, batch_cost: 0.00135s, reader_cost: 0.00006s, ips: 23666.36, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter  60/100] lr: 0.00200, loss: 0.00043, EQ: 0.00043, batch_cost: 0.00222s, reader_cost: 0.00004s, ips: 14436.85, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter  70/100] lr: 0.00200, loss: 0.00046, EQ: 0.00046, batch_cost: 0.00109s, reader_cost: 0.00005s, ips: 29355.91, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter  80/100] lr: 0.00200, loss: 0.00048, EQ: 0.00048, batch_cost: 0.00098s, reader_cost: 0.00003s, ips: 32510.41, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter  90/100] lr: 0.00200, loss: 0.00055, EQ: 0.00055, batch_cost: 0.00165s, reader_cost: 0.00004s, ips: 19451.71, eta: 0:00:00\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Train][Epoch 10/10][Iter 100/100] lr: 0.00200, loss: 0.00055, EQ: 0.00055, batch_cost: 0.00114s, reader_cost: 0.00004s, ips: 28125.44, eta: 0:00:00\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "# initialize solver\n",
    "solver = ppsci.solver.Solver(\n",
    "    model,\n",
    "    constraint,\n",
    "    OUTPUT_DIR,\n",
    "    optimizer,\n",
    "    epochs=EPOCHS,\n",
    "    iters_per_epoch=ITERS_PER_EPOCH,\n",
    "    visualizer=visualizer,\n",
    ")\n",
    "# train model\n",
    "solver.train()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:22.115818900Z",
     "start_time": "2024-11-06T14:29:19.249656800Z"
    }
   },
   "id": "6aa837372c6c48f4"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2024/11/06 22:29:22] ppsci INFO: l2_rel = 0.03063\u001B[0m\n"
     ]
    }
   ],
   "source": [
    "# compute l2-relative error of trained model\n",
    "pred_u = solver.predict(visual_input_dict, return_numpy=True)[\"u\"]\n",
    "l2_rel = np.linalg.norm(pred_u - visual_input_dict[\"u_ref\"]) / np.linalg.norm(\n",
    "    visual_input_dict[\"u_ref\"]\n",
    ")\n",
    "logger.info(f\"l2_rel = {l2_rel:.5f}\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:22.118331500Z",
     "start_time": "2024-11-06T14:29:22.102411600Z"
    }
   },
   "id": "536d2199a45fe62e"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001B[36m[2024/11/06 22:29:22] ppsci MESSAGE: 1D result is saved to: ./output_quick_start_case1\\visual\\u=sin(x).png\u001B[0m\n",
      "[2024/11/06 22:29:22] ppsci INFO: [Visualize] Finish visualization\u001B[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 2 Axes>",
      "image/png": "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uzE4OJjg1imTx+NBamoqXn31VWzZsiV8+7Zt2zA4OMhRxnE0Gg327t07IScC7rrrLrzxxhv44IMPUFlZKXdzFG3Tpk2orq7G008/LXdTotLL3QC52Ww22Gy2Wf1sIBAAALjd7ng2SVFmkk9bWxsuvfRSrF69Grt37076IgQ4u/4zXxmNRqxevRrvvPNO+AM2EAjgnXfewV133SVv40jRJEnC1772Nezduxfvvfcei5AYBAIBxX9GzftCJFb79+/Hxx9/jIsuughZWVmoq6vD97//fVRXVyftaMhMtLW14ZJLLkF5eTkeffRR9PT0hL9XUFAgY8uUo7m5Gf39/Whubobf78eRI0cAAAsWLIDFYpG3cXPsnnvuwbZt27BmzRqsW7cOu3btwvDwMG699Va5myY7p9OJ2tra8NcNDQ04cuQIsrOzUVZWJmPL5HfnnXfihRdewBtvvAGr1RpeU5SRkYGUlBSZWye/+++/H1dccQXKysrgcDjwwgsv4L333sP//d//yd00MXkv2lGPo0ePSpdeeqmUnZ0tmUwmqaKiQvrqV78qtba2yt00Rdi9e7cEIOIfCtq2bVvEfN599125myaLJ554QiorK5OMRqO0bt06ad++fXI3SRHefffdiP1k27ZtcjdNdtHeY3bv3i130xThy1/+slReXi4ZjUbJZrNJn/3sZ6W33npL7mZNa96vESEiIiL5JP8kPhERESkWCxEiIiKSDQsRIiIikg0LESIiIpINCxEiIiKSDQsRIiIikg0LESIiIpINCxEiIiKSDQsRIiIikg0LESIiIpINCxEiIiKSzf8PvR4aXyWSzm4AAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# visualize prediction after finished training\n",
    "solver.visualize()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:22.456915700Z",
     "start_time": "2024-11-06T14:29:22.116819600Z"
    }
   },
   "id": "afb120b6d878f87b"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-11-06T14:29:22.514892900Z",
     "start_time": "2024-11-06T14:29:22.456915700Z"
    }
   },
   "id": "50c500f539a213ff"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
